//
// Created by abstergo on 24-6-7.
//

#ifndef ARRAYS_HPP
#define ARRAYS_HPP

#include <base/base.hpp>
#include <structs/Iterators.h>
#include <set>

namespace tbs::structs {

template<typename T, size_t L> class Array : public Iterable<iterators::PointerIterator<T>> {
private:
  T _data[L];
  size_t _size = 0;

public:

  Array(CONST std::initializer_list<T> &list);

  explicit Array(CONST size_t &init = 0);

  /**
   * @brief 容量
   * @return
   */
  size_t cap() CONST NO_EXCEPT;

  /**
   * @brief 已使用大小
   * @return
   */

  size_t size() CONST NO_EXCEPT;

  /**
   * @brief 定位操作
   * @param index 下标
   * @return 在指定下标位置上的T元素引用
   */

  T &operator[](CONST size_t &index);

  CONST T &operator[](CONST size_t &index) CONST;

  /**
   * @brief 末尾添加
   * @param d
   */
  void append(T &&d);

  /**
   * @brief 末尾添加
   * @param d
   */
  void append(CONST T &d);

  /**
   * @brief 批量插入
   * @param l 插入的列表元素
   * @param index 下标起始位
   */
  void insertList(CONST std::initializer_list<T> &l, CONST size_t &index);

  /**
   * @brief 移除符合条件的项
   * @param predict 条件判断
   * @return 移除个数
   */
  size_t removeIf(std::function<bool(CONST T &, CONST size_t &)> &&predict);

  /**
   * @brief 移除符合项
   * @param indexs 需要移除的下标
   * @return 移除的个数
   */
  size_t removeByIndexs(std::initializer_list<size_t> &&indexs);

  /**
   * @brief 移除符合项
   * @param values 需要移除的数据项
   * @return 移除的个数
   */

  size_t removeByValue(std::initializer_list<T> &&values);

  virtual iterators::PointerIterator<T> begin() NO_EXCEPT override;

  virtual iterators::PointerIterator<T> end() NO_EXCEPT override;

};
}
template<typename T, size_t L> struct std::formatter<tbs::structs::Array<T, L>> : std::formatter<std::string> {
  // parse函数继承自基类即可，因为我们不需要自定义解析逻辑
  using std::formatter<std::string>::parse;

  template<typename FormatContext>
  auto format(const tbs::structs::Array<T, L> &arr, FormatContext &ctx) const {
	// 开始构建格式化的字符串
	std::string result = "[";

	// 迭代Array中的元素
	for (size_t i = 0; i < arr.size(); ++i) {
	  // 如果不是第一个元素，需要在前面添加逗号
	  if (i > 0) {
		result += ",";
	  }
	  // 将当前元素格式化为字符串，并添加到result中
	  result += std::format("{}", arr[i]);
	}

	// 添加结束括号，并使用format_to将result写入到ctx的输出迭代器
	result += "]";
	return std::formatter<std::string>::format(result, ctx);
  }
};

#include "inls/structs/ArrayInl.cuh"

#endif //ARRAYS_HPP